package com.example.mysql_mybatis_demo.springsource.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.stereotype.Component;


/**
 * 自定义的 BeanFactoryPostProcessor
 * 之前讲过，B.F.PostProcessor是在BeanDefinition创建后，Bean实例化之前执行，操作的对象是BeanDefinition
 */
@Component
public class BeanFactoryPostProcessorTest implements BeanFactoryPostProcessor {
    /**
     * 该接口需要实现唯一的方法。
     * 传来的 BeanFactory 包含了当前容器中所有的BeanDefinition
     * 如果打断点就会发现，这之中包括了名为 beanPostProcessorTestBean 的BeanDefinition，内部显示其定义为 BeanPostProcessorTestBean 这个类
     * 同时也有名为 beanPostProcessorTestSecBean 的BeanDefinition，内部显示其定义为 BeanPostProcessorTestSecBean 这个类
     * @param beanFactory
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 获取来名为 beanPostProcessorTestBean 的BeanDefinition
        BeanDefinition beanDefinitionTest = beanFactory.getBeanDefinition("beanPostProcessorTestBean");
        /**
         * 注意，这里做了一个很大胆的操作，直接将 beanPostProcessorTestBean的BeanDefinition的定义类更改为 BeanPostProcessorTestSecBean !!!
         * 在这条命令的末尾打上断点
         * 此时BeanFactory中含有名为 beanPostProcessorTestBean 的BeanDefinition，内部显示其定义为 BeanPostProcessorTestSecBean 这个类
         * 而名为 beanPostProcessorTestSecBean 的BeanDefinition，内部显示其定义仍然为 BeanPostProcessorTestSecBean 这个类
         */
        beanDefinitionTest.setBeanClassName(BeanPostProcessorTestSecBean.class.getName());
    }
}
